package com.lyq.view;

import com.lyq.bean.Student;
import com.lyq.dao.StudentDao;
import com.lyq.utils.Tools;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;

/**
 * 学生信息编辑窗口类
 * 负责提供学生信息的修改功能，包括显示当前信息、接收用户修改并提交更新
 */
public class StudenEditView {
    // 窗口对象
    private final JFrame frame;
    // 学号输入框
    private JTextField studentIDTextField;
    // 姓名输入框
    private JTextField nameTextField;
    // 年级输入框
    private JTextField gradeTextField;
    // 班级输入框
    private JTextField cohortTextField;
    // 原始学号
    private String studentID;
    // 原始姓名
    private String name;
    // 原始性别
    private String sex;
    // 原始年级
    private String grade;
    // 原始班级
    private String cohort;

    // 编辑完成监听器，用于回调更新主界面数据
    private OnEditCompleteListener listener;

    // 窗口宽度常量
    private final int WIDTH = 400;
    // 窗口高度常量
    private final int HEIGHT = 250;

    /**
     * 编辑完成回调接口
     * 当学生信息修改完成并保存后，通过此接口通知调用者更新数据
     */
    public interface OnEditCompleteListener {
        /**
         * 编辑完成回调方法
         * @param updatedStudent 更新后的学生对象
         */
        void onEditComplete(Student updatedStudent);
    }

    /**
     * 构造方法
     * @param studentID 学生学号
     * @param name 学生姓名
     * @param sex 学生性别
     * @param grade 学生年级
     * @param cohort 学生班级
     * @param listener 编辑完成监听器
     */
    StudenEditView(String studentID, String name, String sex, String grade, String cohort, OnEditCompleteListener listener) {
        // 初始化原始数据
        this.studentID = studentID;
        this.name = name;
        this.sex = sex;
        this.grade = grade;
        this.cohort = cohort;
        this.listener = listener;

        // 初始化窗口
        frame = new JFrame();
        // 初始化界面组件
        initView();
        // 设置窗口标题
        frame.setTitle("学生管理系统");
        // 使用绝对布局（手动指定组件位置和大小）
        frame.setLayout(null);
        // 设置窗口不可调整大小
        frame.setResizable(false);
        // 调用工具类方法设置窗口居中显示
        Tools.setPos(frame, WIDTH, HEIGHT);
        // 设置窗口可见
        frame.setVisible(true);

        // 设置窗口图标
        try {
            // 通过类加载器获取图片资源（位于resources/image目录下）
            URL imageUrl = getClass().getResource("/image/logo.png");
            if (imageUrl != null) {
                // 读取图片并设置为窗口图标
                Image logo = ImageIO.read(imageUrl);
                frame.setIconImage(logo);
            } else {
                System.out.println("LOGO图标不存在");
            }
        } catch (IOException e) {
            System.out.println("LOGO图标加载失败");
        }

        // 验证窗口中的组件布局
        frame.validate();
    }

    /**
     * 初始化界面组件
     * 构建编辑窗口的所有UI元素，并设置初始值和事件监听
     */
    private void initView() {
        // 学号标签
        JLabel studentIDLabel = new JLabel("学号");
        studentIDLabel.setBounds(99, 24, 35, 15);
        frame.getContentPane().add(studentIDLabel);

        // 学号输入框（回显原始学号）
        studentIDTextField = new JTextField();
        studentIDTextField.setBounds(144, 21, 150, 20);
        studentIDTextField.setText(studentID);
        studentIDTextField.setEnabled(false);
        frame.getContentPane().add(studentIDTextField);
        studentIDTextField.setColumns(10);

        // 姓名标签
        JLabel nameLabel = new JLabel("姓名");
        nameLabel.setBounds(99, 51, 35, 14);
        frame.getContentPane().add(nameLabel);

        // 姓名输入框（回显原始姓名）
        nameTextField = new JTextField();
        nameTextField.setBounds(144, 48, 150, 20);
        nameTextField.setText(name);
        frame.getContentPane().add(nameTextField);
        nameTextField.setColumns(10);

        // 性别标签
        JLabel lblNewLabel_2 = new JLabel("性别");
        lblNewLabel_2.setBounds(99, 78, 35, 14);
        frame.getContentPane().add(lblNewLabel_2);

        // 创建按钮组，用于管理单选按钮（确保只能选择一个性别）
        ButtonGroup genderGroup = new ButtonGroup();

        // 男性单选按钮
        JRadioButton manRadioButton = new JRadioButton("男");
        manRadioButton.setBounds(144, 74, 40, 22);
        genderGroup.add(manRadioButton);
        frame.getContentPane().add(manRadioButton);

        // 女性单选按钮
        JRadioButton woManRadioButton = new JRadioButton("女");
        woManRadioButton.setBounds(254, 74, 40, 22);
        genderGroup.add(woManRadioButton);
        frame.getContentPane().add(woManRadioButton);

        // 根据原始性别设置默认选中状态
        if (sex.equals("男")) {
            manRadioButton.setSelected(true);
        } else {
            woManRadioButton.setSelected(true);
        }

        // 年级标签
        JLabel gradeLabel = new JLabel("年级");
        gradeLabel.setBounds(99, 102, 35, 14);
        frame.getContentPane().add(gradeLabel);

        // 年级输入框（回显原始年级）
        gradeTextField = new JTextField();
        gradeTextField.setColumns(10);
        gradeTextField.setBounds(144, 99, 150, 20);
        gradeTextField.setText(grade);
        frame.getContentPane().add(gradeTextField);

        // 班级标签
        JLabel cohortLabel = new JLabel("班级");
        cohortLabel.setBounds(99, 129, 35, 14);
        frame.getContentPane().add(cohortLabel);

        // 班级输入框（回显原始班级）
        cohortTextField = new JTextField();
        cohortTextField.setColumns(10);
        cohortTextField.setBounds(144, 126, 150, 20);
        cohortTextField.setText(cohort);
        frame.getContentPane().add(cohortTextField);

        // 确定按钮（保存修改）
        JButton confirmButton = new JButton("确定");
        confirmButton.setBounds(41, 182, 93, 23);
        frame.getContentPane().add(confirmButton);

        // 确定按钮点击事件监听
        confirmButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 获取输入的新数据
                String studentID = studentIDTextField.getText();
                String name = nameTextField.getText();
                String sex = manRadioButton.isSelected() ? "男" : "女";
                String grade = gradeTextField.getText();
                String cohort = cohortTextField.getText();

                // 创建更新后的学生对象
                Student student = new Student(studentID, name, sex, grade, cohort);
                // 调用DAO层方法更新数据库
                int result = StudentDao.updateStudent(student);

                // 根据更新结果提示用户
                if (result == 1) {
                    JOptionPane.showMessageDialog(frame, "修改成功", "提示", JOptionPane.INFORMATION_MESSAGE);
                    // 通知监听器更新数据
                    if (listener != null) {
                        listener.onEditComplete(student);
                    }
                    // 关闭当前窗口
                    frame.dispose();
                } else {
                    JOptionPane.showMessageDialog(frame, "修改失败", "提示", JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        // 取消按钮（放弃修改）
        JButton cancelButton = new JButton("取消");
        cancelButton.setBounds(257, 182, 93, 23);
        frame.getContentPane().add(cancelButton);

        // 取消按钮点击事件（关闭窗口，不保存修改）
        cancelButton.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.dispose();
            }
        });
    }
}